<?php

// Response status
define ('RL_OK',       true);
define ('RL_NOTFOUND', 0);


/**
 * Класс RL_Response -- ответ клиенту.
 *
 * @package RL
 * @author Lucky <lucky@jetstyle.ru>
 * @version $Id: Response.php 62 2007-09-05 08:27:21Z lucky $
 */
class RL_Response
{

	/**
	 * Ссылка на RH.
	 *
	 * @var RL_SiteRequestHandler
	 */
	public $rh;

	/**
	 * Контекст окружения.
	 *
	 * @var RL_Context
	 */
	public $ctx;

	/**
	 * Содержимое ответа.
	 *
	 * @var mixed
	 */
	protected $content;

	/**
	 * Какие-то параметры ответа.
	 *
	 * @var unknown_type
	 */
	protected $content_params = array();

	//!a constructor
	/**
	 * __construct
	 *
	 * @param RL_SiteRequestHandler $rh
	 * @access public
	 */
	public function __construct( RL_SiteRequestHandler $rh )
	{
		$this->rh = $rh;
		$this->ctx = $rh->ctx;
	}


	// -- данные ответа

	//!an accessor
	/**
	 * getContent вернуть данные.
	 *
	 * @access public
	 * @return void
	 */
	public function getContent ()
	{
		return $this->content;
	} // end of function getContent

	//!a manipulator
	/**
	 * Установить контент.
	 *
	 * @param mixed $content чем отвечаем
	 * @param mixed $self_name если установлено, то регистрирует себя в контенте под этим именем.
	 * @access public
	 * @return void
	 */
	public function setContent( $content, $content_type=NULL)
	{
		if (is_string($content)) {
			$this->ctx->rh->useClass('RL_View');
			$view = RL_View::create($this->ctx, 'Text');
			$view->data = $content;
			$content    = $view;
		} else {
			$content->data['response'] = $this;
		}
		$this->content = $content;
		$this->content_type = $content_type;
		if (isset($content_type)) {
			if ($meta = $this->content->getMeta()) {
				foreach ($content_type as $name => $value) {
					$meta->$name = $value;
				}
			}
		}
		return $this;
	}


	// -- параметры данных

	/**
	 * Установить как-то параметры ответа.
	 *
	 * @param array $params
	 */
	public function setContentParams ( array $params = array())
	{
		$this->content_params = $params;
	}

	//!an accessor
	/**
	 * send отправить ответ клиенту.
	 *
	 * @access public
	 * @return $this
	 */
	public function send()
	{
		$protocol = $this->getProtocol();
		$status = $protocol->send($this);
		return $status;
	}

	// -- язык на котором отвечаем

	//!an accessor
	/**
	 * getLanguage вернуть язык на котором отвечать.
	 *
	 * @access public
	 * @return RL_Language
	 */
	public function getLanguage ()
	{
		if (!isset($this->language)) {
			$this->language = $this->buildLanguage();
		}
		return $this->language;
	} // end of function getLanguage

	//!a manipulator
	/**
	 * setLanguage установить язык ответа.
	 *
	 * @param RL_Language $value язык ответа
	 * @access public
	 * @return $this
	 */
	public function setLanguage (RL_Language $value)
	{
		$this->language = $value;
		return $this;
	} // end of function setLanguage

	//!a function
	/**
	 * buildLanguage определить язык.
	 *
	 * fafsfsf
	 * fsaff
	 *
	 * @access public
	 * @return RL_Language
	 */
	public function buildLanguage ()
	{
		return $this->rh->getPreferredLanguage();
	} // end of function buildLanguage


	// -- кодировка

	public function getCharset ()
	{
		if (!isset($this->charset)) {
			$this->charset = $this->buildCharset();
		}
		return $this->charset;
	} // end of function getCharset

	function setCharset($value)
	{
		$this->charset = $value;
		return $this;
	}

	public function buildCharset ()
	{
		return $this->rh->getPreferredOutputCharset();
	} // end of function buildCharset


	// -- протокол по которому отвечаем

	public function getProtocol ()
	{
		if (!isset($this->protocol)) {
			$this->protocol = $this->buildProtocol();
		}
		return $this->protocol;
	} // end of function getProtocol

	public function setProtocol ($value)
	{
		$this->protocol = $value;
		return $this;
	} // end of function setProtocol

	public function buildProtocol ()
	{
		throw new RL_Exception("Can't to detect output protocol");
	} // end of function buildProtocol


	// --  статус ответа

	public function getStatus ()
	{
		if (!isset($this->status)) {
			$this->status = $this->buildStatus();
		}
		return $this->status;
	} // end of function getStatus

	public function setStatus ($value)
	{
		$this->status = $value;
		return $this;
	} // end of function setStatus
	public function buildStatus ()
	{
		if (isset($this->content)) {
			$status = RL_OK;
		} else {
			$status = RL_NOTFOUND;
		}
		return $status;
	} // end of method buildStatus


	/**
	 * Создает объект класса Response
	 *
	 * @param RL_SiteRequestHandler $rh
	 * @param string $response_class тип ответа
	 * @return RL_Response
	 */
	public static function factory ( RL_SiteRequestHandler $rh , $response_class )
	{
		$class = "RL_Response_" . ucfirst(strtolower($response_class));

		$result = $rh->useClass($class);

		if(!$result) {
			return $rh->ctx->debug->error($class . " not found");
		}

		$response = new $class ( $rh );

		return $response;
	}

}


